#ifndef PAGINATION_H
#define PAGINATION_H

#include <QVector>

/**
 * @brief 通用分页类
 * @tparam T 数据类型
 */
template<typename T>
class Pagination
{
public:
    /**
     * @brief 构造函数
     * @param page_size 每页大小
     */
    explicit Pagination(int page_size = 10)
        : current_page_(1)
        , page_size_(page_size)
        , total_count_(0)
    {
    }

    /**
     * @brief 获取当前页
     * @return 当前页码
     */
    int currentPage() const { return current_page_; }

    /**
     * @brief 获取每页大小
     * @return 每页大小
     */
    int pageSize() const { return page_size_; }

    /**
     * @brief 获取总记录数
     * @return 总记录数
     */
    int totalCount() const { return total_count_; }

    /**
     * @brief 获取总页数
     * @return 总页数
     */
    int totalPages() const
    {
        return (total_count_ + page_size_ - 1) / page_size_;
    }

    /**
     * @brief 设置当前页
     * @param page 页码
     */
    void setCurrentPage(int page)
    {
        if (page > 0)
        {
            current_page_ = page;
        }
    }

    /**
     * @brief 设置每页大小
     * @param size 每页大小
     */
    void setPageSize(int size)
    {
        if (size > 0)
        {
            page_size_ = size;
        }
    }

    /**
     * @brief 设置总记录数
     * @param count 总记录数
     */
    void setTotalCount(int count)
    {
        total_count_ = count;
    }

    /**
     * @brief 获取当前页的数据
     * @return 当前页的数据
     */
    QVector<T> getCurrentPageData() const
    {
        return current_page_data_;
    }

    /**
     * @brief 设置当前页数据
     * @param current_page_data 当前页数据
     */
    void setCurrentPageData(const QVector<T> &current_page_data)
    {
        current_page_data_ = current_page_data;
    }

    /**
     * @brief 是否有上一页
     * @return 是否有上一页
     */
    bool hasPreviousPage() const
    {
        return current_page_ > 1;
    }

    /**
     * @brief 是否有下一页
     * @return 是否有下一页
     */
    bool hasNextPage() const
    {
        return current_page_ < totalPages();
    }

    /**
     * @brief 跳转到上一页
     */
    void previousPage()
    {
        if (hasPreviousPage())
        {
            --current_page_;
        }
    }

    /**
     * @brief 跳转到下一页
     */
    void nextPage()
    {
        if (hasNextPage())
        {
            ++current_page_;
        }
    }

    /**
     * @brief 获取当前页的偏移量
     * @return 偏移量
     */
    int offset() const
    {
        return (current_page_ - 1) * page_size_;
    }

private:
    int current_page_;   ///< 当前页码
    int page_size_;      ///< 每页大小
    int total_count_;    ///< 总记录数
    QVector<T> current_page_data_;  ///< 当前页数据
};

#endif // PAGINATION_H 